import { jwtDecode } from "jwt-decode";
import { refreshToken } from '@/views/login/api';
import { clearLogin, getAccessToken, getRefreshToken, setAccessToken } from "./storage";

export const validateToken = (token) => {
    if (token) {
        try {
            let decode = jwtDecode(token);
            return decode.exp > (Date.now() / 1000);
        } catch (e) {
            console.error('token 解析失败！', e);
            return false;
        }
    }
}

/**
 * 校验是否需要刷新token
 * 主动检测接口，提前5分钟刷新接口
 * @returns 
 */
export const isRefreshAccessToken = () => {
    try {
        let token = getAccessToken();
        if (!token) {
            return;
        }
        let decode = jwtDecode(token);
        // 距离过期时间小于5分钟，主动刷新token
        if (decode.exp - (Date.now() / 1000) < 300) {
            refreshAccessToken();
        }
    } catch (e) {
        console.error('token 解析失败！', e);
    }
}

// 刷新token
export const refreshAccessToken = () => {
    let token = getRefreshToken();
    if (!token || !validateToken(token)) {
        window.location.href = '/login';
        return;
    }

    refreshToken(token).then(resp => {
        setAccessToken(resp.data);
    }).catch(e => {
        console.error(e);
        clearLogin();
        window.location.href = '/login';
    });

}

/**
 * accessToken 两小时有效，此处设置每过60分钟刷新一次，页面刷新时，token有效时间不足60分钟，自动刷新一次
 * 设置2小时，连续刷新页面时，会次次刷新token
 * 定时任务设置两小时自动刷新，当某次刷新页面时，会重置定时任务。token失效时，不会自动刷新
 * 
 * 如果要设置2小时自动刷新。可以结合 response 拦截器使用。请求状态码为401时，自动刷新token
 *
 * @returns 
 */
export const isInvalidToken = () => {
    const token = getAccessToken();
    if (token) {
        try {
            const decode = jwtDecode(token);
            // 计算 token 剩余的毫秒数
            const remaining = (decode.exp * 1000) - Date.now();
            // 60 分钟对应的毫秒数
            const minutes = 60 * 60 * 1000;
            return remaining > minutes;
        } catch (e) {
            console.error('token 解析失败！', e);
        }
    }
    return false;
}